package tz.preprocessing.bagOfWords;

import java.util.TreeMap;

/**
 * @author ivana
 * 
 *         tf_idf... Pove pomembnost termina, glede na število pojavitev termina
 *         v dokumentu. Število vsakega termina moramo normalizirati (delimo s
 *         številom besed v enem dokumentu) COUNT tf(i,j)
 * 
 *         INVERSE DOCUMENT FREQUENCY: idf(i) Merilo globalne pomembnosti
 *         besede. Dobimo ga tako, da delimo število vseh dokumentov s številom
 *         dokumentov ki termin vsebujejo. Rezultat še logaritmiramo.
 * 
 *         Nato (tf-idf(ij))=tf(i,j) x idf(i)
 * 
 *         Visoka vrednost tf-idf je dosežena z visoko frekvenco v danem
 *         dokumentu in nizko frekvenco termina v celotni zbirki dokumentov
 */

public class TfIdf
{
	
	/**
	 * Izracuna Tf-Idf algoritem
	 * 
	 * @param bac
	 *            seznam besed enega clanka
	 * @param commonwords
	 *            seznam vseh besed iz nabora clankov, ter stevilo pojavitev
	 *            posamezne besede
	 * @param numOfArticles
	 * 			Število vseh člankov
	 */
	public static BagOfWords calcTfIdf(BagOfWords bag, TreeMap<String, Integer> commonwords, int numOfArticles)
	{
		BagOfWords b = bag;
		int numOfWordsInDoc = b.getwordsInDoc();
		double tf = 0;
		double idf = 0;
		
		for (String word : b.getBag().keySet())
		{
			
			// COUNT tf(i,j)
			tf = b.getBag().get(word) / numOfWordsInDoc; //Normalizacija
			
			// INVERSE DOCUMENT FREQUENCY: idf(i)
			if (commonwords.containsKey(word))
			{
				idf = numOfArticles / (1 + commonwords.get(word)); // dodamo 1, da
																	// se
																	// izognemo
																	// deljenju
																	// z 0
				idf = Math.log10(idf);
			} else
			{
				System.out.println("NAPAKA!!: besede" + word
						+ " ni v commonwords, in je v clanku");
			}
			
			b.getBag().put(word, tf * idf);
			
		}
		
		return b;
	}
}
